/**
 * 文件名：@RegulatorImpl.java <br/>
 * 包名：cn.efunbox.afw.core.regulation <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.regulation;

import java.util.Map;
import java.util.Map.Entry;

import cn.efunbox.afw.core.exception.SystemException;
import cn.efunbox.afw.core.mvc.context.Context;
import cn.efunbox.afw.core.resolver.Resolver;
import cn.efunbox.afw.core.validation.Validator;

/**
 * 类名：RegulatorImpl  <br />
 *
 * 功能：校准器默认实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月2日 下午2:16:20  <br />
 * @version 2015年12月2日
 */
public class RegulatorImpl implements Regulator {
	
	// 校验器配置
	private Map<String, String> setting;
	
	// 校验消息
	private Map<String, String> message;
	
	// 校验器解析器
	private Resolver<Validator> validatorResolver;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月2日 下午2:16:29<br/>
	 * 
	 * @param field
	 * @param value
	 * @param config
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.regulation.Regulator#regulate(cn.efunbox.afw.core.mvc.context.Context, java.lang.String, java.lang.Object, java.util.Map)
	 */
	@Override
	public Object regulate(Context context, String field, Object value, Map<String, String> config) throws Exception {
		// 依次处理每个校验器
		for (Entry<String, String> entry : setting.entrySet()) {
			
			String key = entry.getKey();
			
			String cfg = entry.getValue();
			if (null != config && config.containsKey(key)) {
				cfg = config.get(key);
			}
			
			Validator validator = resolveValidator(key);
			
			if (null == validator) {
				throw new SystemException("validator.resolve.result.is.null", new Object[] { key });
			}
			
			// 交给校验器处理
			value = validator.validate(context, field, value, null == message ? null : message.get(key), cfg);
		}
		
		// 更新值
		//context.setValue(field, value);
		
		return value;
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月2日 下午2:29:40 <br/>
	 */
	protected Validator resolveValidator(String name) throws Exception {
		return validatorResolver.resolve(name);
	}

	/**
	 * @version 2015年12月2日-下午2:57:11
	 */
	public void setSetting(Map<String, String> setting) {
		this.setting = setting;
	}

	/**
	 * @version 2015年12月2日-下午2:57:11
	 */
	public void setMessage(Map<String, String> message) {
		this.message = message;
	}

	/**
	 * @version 2015年12月4日-下午4:35:09
	 */
	public void setValidatorResolver(Resolver<Validator> validatorResolver) {
		this.validatorResolver = validatorResolver;
	}
}
